package org.apli.haiam.admin.jsf.managed;

import com.apli.controladores.Aplinfo;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.ResourceBundle;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmPersona;
import org.apli.haiam.ejb.entidades.CexConsulta;
import org.apli.haiam.ejb.entidades.CexPedidoLaboratorio;
import org.apli.haiam.ejb.entidades.CexTipoExamenLaboratorio;
import org.apli.haiam.ejb.interfaces.ConsExternaAdministrador;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad CexPedidoLaboratorio.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 26/04/2015
 */
@ManagedBean
@ViewScoped
public class JsfLaboratorio extends JsfBean<CexPedidoLaboratorio> {

    @EJB
    private ConsExternaAdministrador hcAdmin;

    final Logger log = LoggerFactory.getLogger(JsfLaboratorio.class);
    private AdmPersona admPersona;
    private int tipoBusqueda;
    private String parametroBusqueda;
    private List<CexTipoExamenLaboratorio> listaExamenLaboratorio;
    private UsuarioAdmin user;
    private Date fecha;
    private boolean isConsulta;
    private List<CexConsulta> listaConsulta;
    private CexConsulta cexConsulta;
    private Date fechaConsulta;

    /**
     * Constructor por defecto.
     */
    public JsfLaboratorio() {
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        //setSwGrabar(false);
        object = new CexPedidoLaboratorio();
        admPersona = new AdmPersona();
        tipoBusqueda = 1;
        parametroBusqueda = "";
        user = (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
        fecha = new Date();
        isConsulta = false;
        cexConsulta = new CexConsulta();
        fechaConsulta = new Date();
        listaConsulta = new ArrayList<>();
        try {
            admPersona.setAprFechaAdmision(admin.getFechaDb());
            admPersona.setAprHoraAdmision(admin.getFechaDb());
            admPersona.setAprIsCedula(true);
            listaExamenLaboratorio = adminObject.listarNullOrdenada(CexTipoExamenLaboratorio.class, "cexTipoExamenLaboratorio", "ctlOrden", true);
        } catch (Exception e) {
            log.error("inicializar() {} ", e.getMessage());

        }

        // cargarListaSubEspecialidad();
//        try {
//             datos = admin.listarNullOrdenada(object.getClass(), "cexEspecialidad","espEstado",1, "espNombre", true);
//             subEspecialidad.setCexEspecialidad(datos.get(1));
////             cargarListaSubEspecialidad();
//        } catch (Exception e) {
//            log.error("inicializar() {} ", e.getMessage());
//        }
//
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            if (object.getCplId() != null) {
                if (isConsulta) {
                    if (cexConsulta.getCcoId() != null) {
                        object.setCexConsulta(cexConsulta);
                    } else {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo grabar el turno", "Agregue historia clínica"));
                        return null;
                    }
                } else {
                    if (admPersona.getAprId() != null) {
                        object.setAdmPersona(admPersona);
                    } else {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo grabar el turno", "Agregue persona"));
                        return null;

                    }
                }

                try {
                    object.setCplEstado(1);
                    object.setCplFecha(admin.getFechaDb());
                    object.setCplHora(admin.getFechaDb());
                    object.setCplIdUsuario(user.getUser().getIdUsuario().intValue());
                    object.setCplNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                    //limpiar la lista detalle
                    object.getCexTipoExamenLaboratorioList().clear();
                    for (CexTipoExamenLaboratorio ojc : listaExamenLaboratorio) {
                        for (CexTipoExamenLaboratorio objHijo : ojc.getCexTipoExamenLaboratorioList()) {
                            if (objHijo.isSeleccionar()) {
                                object.getCexTipoExamenLaboratorioList().add(objHijo);
                            }
                        }
                    }
                    hcAdmin.modificarTransaccion(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                    inicializar();
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));

                } catch (Exception e) {
                    log.error("grabarAction() {} ", e.getMessage());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                }

            }
        } catch (Exception e) {
            log.error("grabarAction() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        cargarLista();
        return null;
    }

    /**
     * Graba el registro asociado al objeto de tipo AdmPersona que se administra
     * en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarPersona() {
        FacesContext context = FacesContext.getCurrentInstance();
        admPersona.setAprPrimerApellido(admPersona.getAprPrimerApellido().toUpperCase().trim());
        admPersona.setAprSegundoApellido(admPersona.getAprSegundoApellido().toUpperCase().trim());
        admPersona.setAprPrimerNombre(admPersona.getAprPrimerNombre().toUpperCase().trim());
        admPersona.setAprSegundoNombre(admPersona.getAprSegundoNombre().toUpperCase().trim());
        if (admPersona.getAprId() == null) {
            if (admPersona.getAprIsCedula()) {
                if (Aplinfo.isRucCedulaValido(admPersona.getAprCedula()) == false) {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "cedula").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Cédula incorrecta", "Cédula incorrecta"));
                    return null;
                }
                admPersona.setAprIdentificacion("");
            } else {
                admPersona.setAprCedula("");
            }
            try {
                if (!admin.existePorCampo(AdmPersona.class, "aprCedula", admPersona.getAprCedula())) {
                    admPersona.setAprEstado(1);
                    adminObject.crear(admPersona, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                    //inicializar();
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error!", bundle.getString("msg.nombre.duplicado")));
                }
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        } else {
            try {
                adminObject.modificar(admPersona, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        }
        return null;
    }

    /**
     * Metodo que busca una historia clinica
     *
     *
     * @author David Carranza
     */
    public void buscarHistorial() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            parametroBusqueda = parametroBusqueda.trim();
            listaConsulta.clear();
            if (parametroBusqueda.equals("")) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "valorBusqueda").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Valor nullo no permitido", "Ingrese parametro de busqueda"));

            } else {
                if (tipoBusqueda == 1) {
                    admPersona = (AdmPersona) admin.buscar(AdmPersona.class, "aprCedula", parametroBusqueda, "aprEstado", 1);
                    if (admPersona == null) {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                        parametroBusqueda = "";
                        return;
                    }
                }
                if (tipoBusqueda == 2) {
                    admPersona = (AdmPersona) admin.buscar(AdmPersona.class, "aprIdentificacion", parametroBusqueda, "aprEstado", 1);
                    if (admPersona == null) {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                        parametroBusqueda = "";
                        return;
                    }
                }
                if (tipoBusqueda == 3) {
                    listaConsulta = admin.listar(CexConsulta.class, "cexPreparacion.cexAgenda.cagFecha", fechaConsulta, "cexPreparacion.cexAgenda.cexHistoriaClinica.chcCedula", parametroBusqueda, "ccoEstado", 1);
                    if (listaConsulta.isEmpty() || listaConsulta.size() < 0) {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                        parametroBusqueda = "";
                        return;
                    }
                }
                if (tipoBusqueda == 4) {
                    listaConsulta = admin.listar(CexConsulta.class, "cexPreparacion.cexAgenda.cagFecha", fechaConsulta, "cexPreparacion.cexAgenda.cexHistoriaClinica.chcHistoriaClinica", parametroBusqueda, "ccoEstado", 1);
                    if (listaConsulta.isEmpty() || listaConsulta.size() < 0) {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                        parametroBusqueda = "";
                    }
                }
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Metodo que limpia persona natural o consulta en cualquiera de los dos
     * casos
     *
     *
     * @author David Carranza
     */
    public void resetearHistoria() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            if (isConsulta) {
                admPersona = new AdmPersona();
            } else {
                cexConsulta = new CexConsulta();
                listaConsulta.clear();
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Calcula la edad actual del paciente ingresado. parametro la fecha de
     * nacimiento
     */
    public void calcularEdad() {
        try {
            Calendar birth = new GregorianCalendar();
            Calendar today = new GregorianCalendar();
            SimpleDateFormat age = new SimpleDateFormat("dd-MM-yyyy");

            int factor = 0;
            admPersona.setAprEdad(0);
            String birthDate1 = age.format(admPersona.getAprFechaNacimiento());
            Date birthDate = new SimpleDateFormat("dd-MM-yyyy").parse(birthDate1);
            Date currentDate = new Date();
            birth.setTime(birthDate);
            today.setTime(currentDate);
            if (today.get(Calendar.MONTH) <= birth.get(Calendar.MONTH)) {
                if (today.get(Calendar.MONTH) == birth.get(Calendar.MONTH)) {
                    if (today.get(Calendar.DATE) > birth.get(Calendar.DATE)) {
                        factor = -1; //Aun no celebra su cumpleaÃ±os
                    }
                } else {
                    factor = -1; //Aun no celebra su cumpleaÃ±os
                }
            }
            admPersona.setAprEdad((today.get(Calendar.YEAR) - birth.get(Calendar.YEAR)) + factor);

        } catch (ParseException e) {
            log.error("calcularEdad {}: {} ", e);

        }

    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    @Override
    public void cargarLista() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            lista = admin.listar(object.getClass(), "cplFechaMuestra", fecha);
            if (lista.isEmpty() || lista.size() < 0) {
                CexPedidoLaboratorio cexPedidolaboratorio = new CexPedidoLaboratorio();
                cexPedidolaboratorio.setCplEstado(0);
                cexPedidolaboratorio.setCplFechaMuestra(fecha);
                for (int i = 0; i < 40; i++) {
                    admin.crear(cexPedidolaboratorio, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                }
                lista = admin.listar(object.getClass(), "cplFechaMuestra", fecha);
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
        try {
//////            List<CexEspecialidad> datosS = admin.listarNullOrdenada(object.getClass(), "cexEspecialidad", "cesEstado", 1, "cesNombre", true);
//////            // datos = admin.listarNullOrdenada(object.getClass(), "cexEspecialidad","espEstado",1, "espNombre", true);
            List<SelectItem> items = new ArrayList<>();
//////            for (CexEspecialidad obj : datosS) {
//////                items.add(new SelectItem(obj, obj.getCesNombre()));
//////            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItem() {} ", e.getMessage());
        }
        return null;
    }

    @Override
    public String editarAction(CexPedidoLaboratorio item) {
        //inicializar();
        object = item;

        listaConsulta.clear();

        if (object.getAdmPersona() != null) {
            admPersona = object.getAdmPersona();
            isConsulta = false;
        } else {
            if (object.getCexConsulta() != null) {
                listaConsulta.add(object.getCexConsulta());
                cexConsulta = object.getCexConsulta();
                isConsulta = true;
            }
        }

        //Limpia lista
        for (CexTipoExamenLaboratorio objTem : listaExamenLaboratorio) {
            for (CexTipoExamenLaboratorio objHijo : objTem.getCexTipoExamenLaboratorioList()) {
                objHijo.setSeleccionar(false);
            }
        }
        if (object.getCplEstado().equals(1)) {
            for (CexTipoExamenLaboratorio objTemTipo : object.getCexTipoExamenLaboratorioList()) {
                for (CexTipoExamenLaboratorio objTem : listaExamenLaboratorio) {
                    if (objTem.getCexTipoExamenLaboratorioList().contains(objTemTipo)) {
                        for (CexTipoExamenLaboratorio objHijo : objTem.getCexTipoExamenLaboratorioList()) {
                            if (objHijo.equals(objTemTipo)) {
                                objHijo.setSeleccionar(true);
                            }
                        }
                    }
                }
            }
        }
        return null;
    }

    public void setEstado(boolean estado) {
//        if (object != null) {
//            object.setCesEstado(estado ? 1 : 0);
//        }
    }

    public boolean isEstado() {
//        if (object != null && object.getCesEstado() != null) {
//            return object.getCesEstado() == 1;
//        }
        return false;
    }

    @Override
    public DataModel<CexPedidoLaboratorio> getDataModel() {
        return null;
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    public AdmPersona getAdmPersona() {
        return admPersona;
    }

    public void setAdmPersona(AdmPersona admPersona) {
        this.admPersona = admPersona;
    }

    public int getTipoBusqueda() {
        return tipoBusqueda;
    }

    public void setTipoBusqueda(int tipoBusqueda) {
        this.tipoBusqueda = tipoBusqueda;
    }

    public String getParametroBusqueda() {
        return parametroBusqueda;
    }

    public void setParametroBusqueda(String parametroBusqueda) {
        this.parametroBusqueda = parametroBusqueda;
    }

    public List<CexTipoExamenLaboratorio> getListaExamenLaboratorio() {
        return listaExamenLaboratorio;
    }

    public void setListaExamenLaboratorio(List<CexTipoExamenLaboratorio> listaExamenLaboratorio) {
        this.listaExamenLaboratorio = listaExamenLaboratorio;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public boolean isIsConsulta() {
        return isConsulta;
    }

    public void setIsConsulta(boolean isConsulta) {
        this.isConsulta = isConsulta;
    }

    public CexConsulta getCexConsulta() {
        return cexConsulta;
    }

    public void setCexConsulta(CexConsulta cexConsulta) {
        this.cexConsulta = cexConsulta;
    }

    public Date getFechaConsulta() {
        return fechaConsulta;
    }

    public void setFechaConsulta(Date fechaConsulta) {
        this.fechaConsulta = fechaConsulta;
    }

    public List<CexConsulta> getListaConsulta() {
        return listaConsulta;
    }

    public void setListaConsulta(List<CexConsulta> listaConsulta) {
        this.listaConsulta = listaConsulta;
    }

}
